home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 015 / printset.arc / PRINTSET.C < prev    next >
C/C++ Source or Header  |  1985-08-13  |  18KB  |  475 lines

  1. /*  PRINTSET.C
  2.  
  3.     Program to allow setup of printer special functions.
  4.  
  5.     Copyright (c) 1985, Hawkeye PC Programmer's SIG
  6.  
  7.  
  8.     Revision History
  9.  
  10.     03/26/85    Version 1.01    Added compiler run-time memory limitations
  11.                                 so the program doesn't overwrite command.com
  12.                                 in high RAM.    Modified by Gordon Waite.
  13.  
  14.                                 Changed exit: if invoked with complete comm
  15.                                 line, no exit messages are printed.  Suggested
  16.                                 by Bob Bryla.  Modified by Gordon Waite.
  17.  
  18.                                 Revised the DELETE key routine during integer
  19.                                 entry.  Changed case where cursor is in last
  20.                                 position.  Modified by Gordon Waite.
  21.  
  22.                                 Changed CHOICES to CHOICE in commands menu.
  23.                                 Modified by Gordon Waite.
  24.  
  25.     07/11/85    Version 1.02    Added color attributes for C/G users.
  26.  
  27.                                 Added the /b option to force monochrome.
  28.  
  29.     07/14/85    Version 1.03    Fixed two printer setups by replacing
  30.                                 upper case IBM's to lower case.  This was
  31.                                 needed to work with the parser forcing
  32.                                 command line arguments to lower case prior
  33.                                 to parsing.  Modified by Gordon Waite.
  34.  
  35.                                 Added a check after the shareware screen is
  36.                                 displayed to look for the user pressing the
  37.                                 ESC key.  If that is done, the program will
  38.                                 now terminate instead of passing on to the
  39.                                 next stage.  Modified by Gordon Waite.
  40.  
  41.     08/08/85    Version 1.04    Fixed problems with the Gemini printer.
  42.  
  43.     08/13/85    Version 1.05    Added oki100-ibm printer setup
  44.  
  45.     This program was compiled using the Computer Innovations C-86 'C'
  46.     compiler, version 2.3, using the small memory model.
  47.  
  48. =======================================================================  */
  49.  
  50.  
  51.  
  52. #define DEBUG   0               /*  set to 0 when done with debugging, else 1 */
  53.  
  54. #include "printset.h"
  55.  
  56. #include "screen1"              /*  shareware & copyright notice              */
  57.  
  58. #define MAXCOMMS  18            /*  current number of possible commands       */
  59. #define MAXCUST   20            /*  20 chars is maximum custom setup string   */
  60.  
  61. struct pstuff {                 /*  definition of a printer data structure    */
  62.     char *pname;
  63.     char *comms[MAXCOMMS];
  64. };
  65.  
  66. #include "printers.c"           /*  actual printer definitions                */
  67.  
  68.  
  69.  
  70. /*  ==================   External Function Declarations ===================== */
  71.  
  72. extern FILE *fopen();
  73. extern int fclose();
  74.  
  75. extern char atcheck();
  76. extern int crt_srcp(), dispmem(), equipmnt(), initcell();
  77. extern int keystrok(), movescrn(), strlen();
  78. extern int beep(), checker(), crt_srcp(), isdigit();
  79. extern int readcls(), readcha(), to24(), writcho();
  80. extern long atoi();
  81. extern char *malloc(), *strcpy();
  82.  
  83.  
  84.  
  85. /*  ==================   Internal Function Declarations  ===================  */
  86.  
  87. int parsecom(), getname(), getcomm(), getout(), setup(), transpos(), usage();
  88. int commhelp(), inint();
  89.  
  90.  
  91.  
  92. /*  =========================   Global Variables  ==========================  */
  93.  
  94. int prntnumb;           /*  number of printer (name) found in command line    */
  95. int prntcomm[MAXCOMMS]; /*  list of number of comm's found in command line    */
  96. int needprnt;           /*  if 1, no printer name was found in command line   */
  97. int needcomm;           /*  if 1, no direct commands were found in comm line  */
  98. char *dolist[MAXCOMMS]; /*  the actual command list to be sent to the printer */
  99. char custlist[MAXCUST]; /*  custom setup array;  filled in by user            */
  100. FILE *p;                /*  pointer to a file                                 */
  101.  
  102. char *commname[] = {    /*  the codes used to identify specific commands      */
  103.                         /*  an array of pointers to character strings         */
  104.     "pi",               /*  pica                                              */
  105.     "el",               /*  elite                                             */
  106.     "co",               /*  compressed                                        */
  107.     "pro",              /*  proportional spacing                              */
  108.     "exon",             /*  expanded print on                                 */
  109.     "exoff",            /*  expanded print off                                */
  110.     "bon",              /*  boldface on                                       */
  111.     "boff",             /*  boldface off                                      */
  112.     "uon",              /*  underline on                                      */
  113.     "uoff",             /*  underline off                                     */
  114.     "norm",             /*  normal character set                              */
  115.     "alt1",             /*  alternate char set #1                             */
  116.     "alt2",             /*  alternate char set #2                             */
  117.     "gr",               /*  graphics char set                                 */
  118.     "ff",               /*  form feed                                         */
  119.     "1-6s",             /*  1/6 inch line spacing                             */
  120.     "1-8s",             /*  1/8 inch line spacing                             */
  121.     "reset",            /*  reset printer                                     */
  122.     0                   /*  Null-terminate the list                           */
  123. };
  124.  
  125. char *commdisp[] = {    /*  the names shown on menus                          */
  126.     "pica",
  127.     "elite",
  128.     "compressed",
  129.     "proportional spacing",
  130.     "expanded print on",
  131.     "expanded print off",
  132.     "boldface on",
  133.     "boldface off",
  134.     "underline on",
  135.     "underline off",
  136.     "normal character set",
  137.     "alternate character set #1",
  138.     "alternate character set #2",
  139.     "graphics character set",
  140.     "form feed",
  141.     "1/6 inch line spacing",
  142.     "1/8 inch line spacing",
  143.     "printer reset",
  144.     0                   /*  Null-terminate the list                           */
  145. };
  146.  
  147. unsigned char *msg1 = "PRINTSET  ver 1.05   (c) 1985, Hawkeye PC User Group, ALL RIGHTS RESERVED";
  148.  
  149.  
  150.  
  151. /*  =======================================================================  */
  152. /*                              M A I N L I N E                              */
  153. /*  =======================================================================  */
  154.  
  155.  
  156. main(argc, argv)
  157. int argc;           /*  number of command line arguments passed in   */
  158. char *argv[];       /*  array of ptrs to the command line arguments  */
  159. {
  160.     int status;     /*  status returned from a function call         */
  161.  
  162.     equipmnt();     /*  find out what equipment we're running on...   */
  163.  
  164.     if (!parsecom( argc, argv )) {  /*  process the command line   */
  165.         /*  if the returned status = 0, something is wrong!  */
  166.         usage();
  167.         exit(1);
  168.     }
  169.  
  170.     if (needprnt OR needcomm)     /*  display the shareware screen  */
  171.         showshar();
  172.  
  173.     if (needprnt)             /*  show a menu of printers              */
  174.         if (!getname())
  175.             exit(1);
  176.  
  177.     if (needcomm)             /*  show a menu of commands              */
  178.         if (!getcomm())
  179.             exit(1);
  180.  
  181.     transpos();   /*  translate the command numbers into commands  */
  182.  
  183.     setup();        /*  actually run out the printer setup codes  */
  184.  
  185.     if (needprnt OR needcomm)   /*  didn't use command line  */
  186.         getout(1);       /*  exit from the program!  */
  187. }
  188.  
  189.  
  190. /*  ==========================  End of Mainline  ==========================  */
  191.  
  192.  
  193.  
  194. /*  =======================================================================  */
  195. /*                            Internal Functions
  196. /*  =======================================================================  */
  197.  
  198.  
  199.  
  200. int usage()     /*  function which shows the user proper invocation of prog  */
  201. {
  202.     int i, j, k;                /*  loop variables  */
  203.     char buff[21];              /*  place to build an output line  */
  204.     char buff2[11];             /*  ditto  */
  205.     char buff3[31];             /*  ditto  */
  206.  
  207.     buff[20] = buff2[10] = buff3[30] = '\0';
  208.  
  209.     puts("");
  210.     puts(msg1);
  211.     puts("");
  212.     puts("usage:  printset [?] [/b] [printer name] [option list] [custom xx xx ... ]\n");
  213.     puts("where available printer names are:");
  214.  
  215.     for (i = 0; printers[i].pname; i += 4) {
  216.         for (j = 0; j < 4 AND printers[i+j].pname; ++j) {
  217.             for (k = 0; k < 20; ++k)
  218.                 if (k < strlen(printers[i+j].pname))
  219.                     buff[k] = printers[i+j].pname[k];
  220.                 else
  221.                     buff[k] = ' ';
  222.             printf("%s", buff);
  223.         }
  224.         if (j != 4)
  225.             break;
  226.     }
  227.  
  228.     printf("\n\nand options are:\n");
  229.  
  230.     for (i = 0; commdisp[i]; i += 2) {
  231.         for (j = 0; j < 2 AND commdisp[i+j]; ++j) {
  232.             for (k = 0; k < 10; ++k)
  233.                 if (k < strlen(commname[i+j]))
  234.                     buff2[k] = commname[i+j][k];
  235.                 else
  236.                     buff2[k] = ' ';
  237.             printf("%s", buff2);
  238.             for (k = 0; k < 30; ++k)
  239.                 if (k < strlen(commdisp[i+j]))
  240.                     buff3[k] = commdisp[i+j][k];
  241.                 else
  242.                     buff3[k] = ' ';
  243.             printf("%s", buff3);
  244.         }
  245.         if (j != 2)
  246.             break;
  247.     }
  248.     printf("\nThe /b option stops color display for monochrome users with color cards.");
  249. }
  250.  
  251.  
  252. /*  .......................................................................  */
  253.  
  254.  
  255. int showshar()      /*  display the shareware notice  */
  256. {
  257.     int action;     /*  the user's keystroke  */
  258.  
  259.     movescrn( screen1, sizeof(screen1) );
  260.     atcheck( &scrn[1][4], 15, 15, 74 );
  261.     atcheck( &scrn[3][9], 15, 15, 69 );
  262.     dispmem( scrn );
  263.     crt_srcp( 25, 0, 0 );       /*  send the cursor off page             */
  264.     action = keystrok();        /*  get any character from the keyboard  */
  265.     if (action EQUALS ESC)
  266.         exit();
  267.     return;
  268. }
  269.  
  270.  
  271. /*  .......................................................................  */
  272.  
  273.  
  274. int getname()   /*  presents a menu of printer names to the user  */
  275. {
  276.     int answer;             /*  stores the user's reponse  */
  277.     int i;                  /*  loop variable  */
  278.     int row, col;           /*  screen coordinates  */
  279.     unsigned char buff[40]; /*  a buffer to build a printer line  */
  280.     int ok;                 /*  is an entry OK?  1 = yes, 0 = no  */
  281.     int retstat, retchar;   /*  used with inint()   */
  282.  
  283. #if DEBUG
  284.     cls();
  285.     printf("Inside GETNAME\n\n");
  286.     keystrok();
  287. #endif
  288.  
  289.     initcell( &scrn[0][0], ' ', 7, 7 );     /*  clear out the screen buff  */
  290.     checker( &scrn[0][0], 15, 15, msg1 );   /*  copyright message  */
  291.     checker( &scrn[2][0], 7, 4, "List of possible printers:");
  292.  
  293.     row = 5;
  294.     col = 5;
  295.  
  296.     for (i = 0; printers[i].pname; ++i, ++row) {   /*  build the names list  */
  297.         if (i != 0 AND i % 15 EQUALS 0) {      /*  new row  */
  298.             row = 5;
  299.             col += 20;
  300.         }
  301.         sprintf(buff, "%2d.  %s", i+1, printers[i].pname);  /*  build line  */
  302.         checker( &scrn[row][col], 15, 15, buff );   /*  update scrn buffer  */
  303.     }
  304.  
  305.     checker( &scrn[22][0], 15, 4,
  306.              "Please enter your choice  [ESC to exit]  ==>" );
  307.  
  308.     ok = 0;
  309.  
  310.     while (!ok) {
  311.         dispmem( scrn );       /*  display the screen  */
  312.         crt_srcp( 22, 46, 0 );
  313.         checker( &scrn[22][46], 7, 7, "  ");
  314.         crt_srcp( 22, 46, 0 );
  315.         answer = inint( 2, "  ", 1, &retstat, &retchar );
  316.  
  317. #if DEBUG
  318.     cls();
  319.     crt_srcp(0,0,0);
  320.     printf("The returned value of answer is %d.\n", answer);
  321.     printf("Values of RETSTAT = %d, RETCHAR = %d\n\n", retstat, retchar);
  322.     printf("I happens to be = %d\n", i);
  323.     keystrok();
  324. #endif
  325.  
  326.         if (retstat EQUALS 1)    /*  ESC was entered  */
  327.             getout(0);
  328.         if (answer < 1 OR answer > i) {
  329.             beep();
  330.         }   
  331.         else {
  332.             ok = 1;
  333.         }
  334.     }
  335.  
  336.     prntnumb = answer - 1;
  337.  
  338.     return(1);  /*  everything is OK  */
  339. }
  340.  
  341.  
  342. /*  .......................................................................  */
  343.  
  344.  
  345. int getcomm()       /*  present a menu of possible printer commands  */
  346. {
  347.     int answer;             /*  stores the user's reponse  */
  348.     int i;                  /*  loop variable  */
  349.     int row;                /*  screen coordinates  */
  350.     unsigned char buff[40]; /*  a buffer to build a printer line  */
  351.     int ok;                 /*  is an entry OK?  1 = yes, 0 = no  */
  352.     int count;              /*  count of entered values  */
  353.     int tcomms[MAXCOMMS];   /*  temp array to hold status of settings  */
  354.     int found;              /*  turned on when bad entry is found in list  */
  355.     int numbcoms;           /*  number of possible commands  */
  356.     int retstat, retchar;   /*  used with inint()   */
  357.  
  358. #if DEBUG
  359.     cls();
  360.     printf("Inside GETCOMM\n\n");
  361.     keystrok();
  362. #endif
  363.  
  364.     for (i = 0; i < MAXCOMMS; ++i)
  365.         tcomms[i] = 0;
  366.  
  367.     initcell( &scrn[0][0], ' ', 7, 7 );     /*  clear out the screen buff  */
  368.     checker( &scrn[0][0], 15, 15, msg1 );   /*  copyright message  */
  369.     checker( &scrn[2][0], 7, 4, "List of possible commands:");
  370.  
  371.     row = 4;
  372.  
  373.     for (i = 0; commname[i]; ++i, ++row) {   /*  build the comm names list  */
  374.         sprintf(buff, "%2d.  %s", i+1, commdisp[i] );  /*  build line  */
  375.         checker( &scrn[row][7], 15, 15, buff );   /*  update scrn buffer  */
  376.     }
  377.     numbcoms = i;
  378.  
  379.     checker( &scrn[23][0], 15, 4,
  380.              "Please enter your choice  ==>" );
  381.  
  382.     commhelp();
  383.  
  384.     count = 0;
  385.     answer = -1;
  386.  
  387.     while (answer != 0 AND count < MAXCOMMS) {  /*  loop til a 0 is entered  */
  388.         ok = 0;
  389.         while (!ok) {        /*  loop until user enters a valid number  */
  390.             dispmem( scrn );       /*  display the screen  */
  391.             crt_srcp( 23, 31, 0 );
  392.             checker( &scrn[23][31], 7, 7, "  " );
  393.             crt_srcp( 23, 31, 0 );
  394.             answer = inint( 2, "  ", 1, &retstat, &retchar );
  395.             if (retstat EQUALS 1)    /*  ESC was entered  */
  396.                 getout(0);
  397.             if (answer < 0 OR answer > numbcoms)
  398.                 beep();
  399.             else
  400.                 ok = 1;
  401.         }
  402.  
  403.         /*  at this point, user has entered a valid number...  */
  404.         /*  process the answer, and if needed, go back for another entry  */
  405.  
  406.         if (answer != 0) {
  407.             if (tcomms[answer-1] EQUALS 1) {
  408.                 /*  if already entered, toggle it back off  */
  409.                 tcomms[answer-1] = 0;
  410.                 found = 0;
  411.                 for (i = 0; i <= count; ++i) {
  412.                     if (found) {
  413.                         prntcomm[i-1] = prntcomm[i];
  414.                     }
  415.                     else {
  416.                         if (prntcomm[i] EQUALS answer-1) {
  417.                             found = 1;
  418.                         }
  419.                     }
  420.                 }
  421.                 --count;    /*  fix the entry count  */
  422.                 checker( &scrn[answer + 3][5], 7, 7, " " );  /*  fix fancy...  */
  423.             }
  424.             else {
  425.                 tcomms[answer-1] = 1;   /*  mark in our possible command list  */
  426.                 prntcomm[count++] = answer - 1;   /*  add command to our list  */
  427.                 checker( &scrn[answer + 3][5], 15, 14, "»" );  /*  get fancy...  */
  428.             }
  429.         }
  430.     }
  431.  
  432.     if (count EQUALS 0) {      /*  user entered no commands...  */
  433.         getout(0);
  434.     }
  435.  
  436.     return(1);  /*  everything is OK  */
  437. }
  438.  
  439.  
  440. /*  .......................................................................  */
  441.  
  442.  
  443. int commhelp()      /*  places additional help text on screen  */
  444. {
  445.     checker( &scrn[4][55],  15, 15, "INSTRUCTIONS");
  446.     atcheck( &scrn[4][55], 112, 112, 12);
  447.  
  448.     checker( &scrn[6][44],  7, 1, "-- Type in option numbers, pressing");
  449.     checker( &scrn[7][44],  7, 1, "   ENTER between each number.");
  450.  
  451.     checker( &scrn[9][44],  7, 1, "-- Enter a zero (0) to complete the");
  452.     checker( &scrn[10][44],  7, 1, "   setup.");
  453.  
  454.     checker( &scrn[12][44], 7, 1, "-- Press the ESC key to cancel the");
  455.     checker( &scrn[13][44], 7, 1, "   setup and exit the program.");
  456.  
  457.     checker( &scrn[15][44], 7, 1, "-- Entering an option a second time");
  458.     checker( &scrn[16][44], 7, 1, "   will cancel that option.");
  459. }
  460.  
  461.  
  462. /*  .......................................................................  */
  463.  
  464.  
  465. /*  PARSECOM.C
  466.  
  467.     This function is used to parse the command line passed into the
  468.     program PRINTSET.  This function must accomplish three things:
  469.  
  470.     1.  If the user enters a printer name on the command line, PARSECOM
  471.         must take the name and check for its validity.  If the printer
  472.         name is valid, the proper printer number is loaded into the
  473.         global variable PRNTNUMB.  If no printer name is given in the
  474.         command line, parsecom must set the global variable NEEDPRNT
  475.         to zero (0) to ref